#ifndef eNPC_H
#define eNPC_H

#include <QMainWindow>
#include <QMessageBox>
#include <QFileDialog>
#include <QInputDialog>
#include <QColorDialog>
#include <QFontDialog>
#include <QTextBlock>

#include "highlighter.h"
#include "linenumber.h"
#include "textedit.h"
#include "documentation.h"
#include "searchdock.h"
#include "searchandreplace.h"
#include "meswizard.h"
#include "menuwizard.h"


namespace Ui {
    class eNPC;
}

class eNPC : public QMainWindow
{
    Q_OBJECT

    public:
        explicit eNPC(QWidget *parent = 0);
        static QString getSelectedColor();
        static void fillColor(QPlainTextEdit*);
        ~eNPC();

    protected:
        virtual void closeEvent(QCloseEvent *e);
        void dragEnterEvent(QDragEnterEvent *event);
        void dropEvent(QDropEvent *event);

    private slots:
        void showDocumentation(QString, QString); // Affiche le panneau de documentation (à droite)
        void setTabWilcard(); // Ajoute "*" au nom des onglets dont le contenu a été modifié
        void enablePasteAction();
        void insertGivenMes(QString);
        void insertGivenMenu(QStringList, QStringList, bool);
        void displaySearchAllResults(QMap<int, QString>&, QString&);
        void matchParentheses();
        void openRecentFile();
        void goToSearchResultLine(int);

        void on_tabWidget_tabCloseRequested(int index);
        void on_tabWidget_currentChanged(int index);
        void on_actionNouveau_triggered();
        void on_actionEnregistrer_triggered();
        void on_actionEnregistrer_sous_triggered();
        void on_actionAnnuler_triggered();
        void on_actionR_peter_triggered();
        void on_actionQuitter_triggered();
        void on_actionFermer_ce_script_triggered();
        void on_actionCopier_triggered();
        void on_actionColler_triggered();
        void on_actionCouper_triggered();
        void on_actionRechercher_triggered();
        void on_actionS_lectionner_tout_triggered();
        void on_actionOuvrir_triggered();
        void on_actionBarre_de_raccourcis_triggered();
        void on_actionNum_ros_de_ligne_triggered();
        void on_actionPolice_triggered();
        void on_actionEn_t_te_triggered();
        void on_actionTout_fermer_triggered();
        void on_action_propos_triggered();
        void on_actionAller_triggered();
        void on_actionRemplacer_triggered();
        void on_actionDupliquer_la_ligne_triggered();
        void on_actionDocumentation_triggered();
        void on_actionCouleur_triggered();
        void on_actionMessages_triggered();
        void on_actionMenu_triggered();

    private:
        Ui::eNPC *ui;
        Documentation *docDock; // Volet de documentation (affiché sur la droite)
        SearchDock *searchDock; // Volet de recherche (affiché en bas)
        QMap<QWidget*, TextEdit*> tabList; // Référentiel de tous les TextEdit créés et toujours utilisés
        QMap<QWidget*, QString> fileList; // Référentiel des fichiers toujours ouverts
        QMap<QWidget*, Highlighter*> highlighterList;
        QFont myFont; // "Font" par défaut de l'application

        bool mayBeSaved(QWidget *t);
        QMessageBox::StandardButton askSave();
        void removeTab(QWidget*);
        bool saveFile(QWidget*);
        bool saveFileAs(QWidget*);
        void disableTabNeededActions(); // Désactive certaines fonctionnalités de l'UI lorsque le dernier tab est fermé
        void enableTabNeededActions(); // Les réactive...
        QAbstractItemModel *modelFromFile(const QString&, TextEdit*); // Fournit la liste des keywords à l'autocompletion
        QString getFileNameFromPath(QString path); //* Utilise une regexp pour récupérer le nom du fichier avec son chemin
        void openFilesWithArgs(QStringList args); // Ouverture "multiple" de fichiers
        bool openFile(QString filePath, QString fileName, bool silence = false);
        TextEdit* getCurrentTextEdit(); // Pointeur sur le TextEdit de l'onglet courant
        void goToLine(int);

        // Parentheses/braces matching
        bool matchLeft(QTextBlock currentBlock, int index, int numRight, char toMatch);
        bool matchRight(QTextBlock currentBlock, int index, int numLeft, char toMatch);
        void createSelection(int pos);
        char getOppositeCharOf(char toMatch);

        static int nbTab; // Numéro du dernier onglet en cours

        // Historique des fichiers récents
        enum { MaxRecentFiles = 5 };
        QAction *recentFileActs[MaxRecentFiles];
        void writeInRecentFileList(const QString&);
        void updateRecentFileActions(); // Met à jour le menu Fichier->Fichiers récents

        // Ouverture des derniers fichiers restés ouverts
        void openLastFilesList();
        void saveLastFilesList(const QStringList &);
};

#endif // eNPC_H
